package swimv2gm.bl.session;

import java.util.List;
import java.util.Map;

import javax.ejb.Remote;

import swimv2gm.bl.domain.ExternalWorkRequest;
import swimv2gm.bl.domain.InternalWorkRequest;
import swimv2gm.bl.domain.WorkRequest;
import swimv2gm.bl.util.WorkRequestData;

/**
 * Gestore di richieste di lavoro: permette di inserire, gestire e visualizzare
 * richieste di lavoro sia interne che esterne.
 * 
 * @author Matteo Gallesio
 */
@Remote
public interface WorkRequestManager {

	/**
	 * Crea una richiesta di lavoro interna.
	 * 
	 * @param mitt
	 *            l'id del mittente
	 * @param dest
	 *            l'id del destinatario
	 * @param campo
	 *            l'id della competenza
	 * @param desc
	 *            la descrizione
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti
	 */
	public boolean createRequest(long mitt,long dest,long campo,String desc);

	/**
	 * Crea una richiesta di lavoro esterna.
	 * 
	 * @param mitt
	 *            l'indirizzo e-mail del mittente
	 * @param dest
	 *            l'id del destinatario
	 * @param campo
	 *            l'id della competenza
	 * @param desc
	 *            la descrizione
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti
	 */
	public boolean createRequest(String mitt,long dest,long campo,String desc);

	/**
	 * Imposta una richiesta di lavoro come accettata o rifiutata.
	 * 
	 * @param wrid
	 *            l'id della richiesta di lavoro
	 * @param accepted
	 *            <code>true</code> se la richiesta dev'essere accettata,
	 *            <code>false</code> se dev'essere rifiutata
	 * @param uid
	 *            l'id del destinatario, usato per verificare che l'operazione
	 *            sia effettivamente richiesta dal destinatario della richiesta
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti
	 */
	public boolean processRequest(long wrid,boolean accepted,long uid);

	/**
	 * Ottiene i dati di una richiesta di lavoro, mappati nelle seguenti chiavi:
	 * <ul>
	 * <li>id - l'id della richiesta</li>
	 * <li>desc - la descrizione della richiesta</li>
	 * <li>dest_id - l'id del destinatario</li>
	 * <li>dest_name - il nome del destinatario</li>
	 * <li>mitt_id - l'id del mittente (presente solo per le richieste esterne)</li>
	 * <li>mitt_name - il nome del mittente per le richieste interne, il suo
	 * indirizzo per le richieste esterne</li>
	 * <li>date - la data d'invio</li>
	 * <li>a_id - l'id della competenza</li>
	 * <li>a_name - il nome della competenza</li>
	 * <li>status - lo stato della richiesta, come ottenuto da
	 * <code>WorkRequestStatus.toString()</code></li>
	 * </ul>
	 * 
	 * @param wrid
	 *            l'id della richiesta
	 * @return una mappa contenente i dati, o <code>null</code> se la richiesta
	 *         non esiste
	 */
	public Map<String,String> getRequestData(long wrid);

	/**
	 * Ottiene la lista, in formato ridotto, delle richieste di lavoro ricevute
	 * dall'utente specificato.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @return la lista delle richieste di lavoro ricevute, o <code>null</code>
	 *         se l'utente non è valido
	 * @see WorkRequestData
	 */
	public List<WorkRequestData> getReceivedWorkRequestsData(long uid);

	/**
	 * Ottiene la lista, in formato ridotto, delle richieste di lavoro inviate
	 * dall'utente specificato.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @return la lista delle richieste di lavoro inviate, o <code>null</code>
	 *         se l'utente non è valido
	 * @see WorkRequestData
	 */
	public List<WorkRequestData> getSentWorkRequestsData(long uid);

	/**
	 * Restituisce la richiesta di lavoro con l'id fornito.
	 * 
	 * @param wrid
	 *            l'id della richiesta
	 * @return la richiesta, o <code>null</code> se inesistente
	 */
	public WorkRequest getWorkRequest(long wrid);

	/**
	 * Restituisce la richiesta di lavoro interna con l'id fornito.
	 * 
	 * @param iwrid
	 *            l'id della richiesta
	 * @return la richiesta, o <code>null</code> se inesistente
	 */
	public InternalWorkRequest getInternalWorkRequest(long iwrid);

	/**
	 * Restituisce la richiesta di lavoro esterna con l'id fornito.
	 * 
	 * @param ewrid
	 *            l'id della richiesta
	 * @return la richiesta, o <code>null</code> se inesistente
	 */
	public ExternalWorkRequest getExternalWorkRequest(long ewrid);
}
